package com.unalm.examensustitutorio.controlador;

import java.io.Serializable;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage.Severity;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIData;
import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;

import com.unalm.examensustitutorio.service.ApplicationBusinessDelegate;
import com.unalm.examensustitutorio.service.ISAula;
import com.unalm.examensustitutorio.service.ISCronogramaExamen;
import com.unalm.examensustitutorio.service.ISCurso;
import com.unalm.examensustitutorio.service.ISInscripcion;
import com.unalm.examensustitutorio.service.ISTipoExamen;
import com.unalm.examensustitutorio.service.ISUsuario;
import com.unalm.examensustitutorio.util.entity.EAula;
import com.unalm.examensustitutorio.util.entity.ECronogramaExamen;
import com.unalm.examensustitutorio.util.entity.ECurso;
import com.unalm.examensustitutorio.util.entity.EInscripcion;
import com.unalm.examensustitutorio.util.entity.ETipoExamen;
import com.unalm.examensustitutorio.util.entity.EUsuario;
import com.unalm.examensustitutorio.utils.Util;

@ManagedBean(name = "cInscripcionController")
@SessionScoped
public class CInscripcionController extends CGenericController implements
		Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 6719000146197637054L;
	private static ApplicationBusinessDelegate abd = new ApplicationBusinessDelegate();
	private static ISUsuario sIsUsuario = abd.getIsUsuario();
	private static ISCurso sIsCurso = abd.getIsCurso();
	private static ISTipoExamen sIsTipoExamen = abd.getIsTipoExamen();
	private static ISInscripcion sIsInscripcion = abd.getIsInscripcion();
	private static ISAula sIsAula = abd.getIsAula();
	private static ISCronogramaExamen sIsCronograma = abd
			.getIsCronogramaExamen();

	CSeguridadController cSeguridadController = (CSeguridadController) FacesContext
			.getCurrentInstance().getExternalContext().getSessionMap()
			.get("cSeguridadController");
	private List<EUsuario> lstAlumnos;

	private EUsuario alumno;

	private boolean mDtbAlumnos;

	private boolean mAlumno;

	private String codTipoExamen;

	private String codCursoDisponible;

	private String codDocente;

	private String codAula;

	private List<ECronogramaExamen> lstHorario;

	private List<EInscripcion> lstInscripcion;

	public CInscripcionController() {

		inicializarDatos();

	}

	public void inicializarDatos() {

		codCursoDisponible = "";
		codTipoExamen = "";
		codDocente = "";
		codAula = "";
		mAlumno = false;
		mDtbAlumnos = true;
		

	}

	/**
	 * Registro de Inscripcion desde un Usuario alumno
	 * 
	 * @return
	 */

	public String registrarInscripcionAlumno() {

		if (validarRegistroInscripcion()) {

			EInscripcion inscripcion = new EInscripcion();

			inscripcion.getTbCurso().setStr_codCurso(codCursoDisponible);
			inscripcion.getTbTipoExamen().setStr_codTipo(codTipoExamen);
			inscripcion.getTbUsuario().setStr_codUsuario(
					cSeguridadController.geteUsuario().getStr_codUsuario());

			try {

				sIsInscripcion.insertaInscripcion(inscripcion);

				inicializarDatos();

				addFacesMessage(msg.SEVERITY_INFO,
						"Se Registro la Inscripcion Correctamente", null);

			} catch (Exception e) {
				// TODO: handle exception
			}
		}
		return null;

	}

	/**
	 * Valida el Registro Inscripcion
	 * 
	 * @return
	 */
	public boolean validarRegistroInscripcion() {
		boolean valida = true;

		if (Util.estaVacio(codCursoDisponible)) {

			addFacesMessage(msg.SEVERITY_ERROR,
					"Tiene que Elegir un Curso para la inscripcion", null);

			valida = false;
		}
		if (Util.estaVacio(codTipoExamen)) {

			addFacesMessage(msg.SEVERITY_ERROR,
					"Tiene que Elegir un Tipo de Examen para la inscripcion",
					null);

			valida = false;

		}

		return valida;
	}

	public String registrarInscripcion() {

		if (validarRegistroInscripcion()) {

			EInscripcion inscripcion = new EInscripcion();

			inscripcion.getTbCurso().setStr_codCurso(codCursoDisponible);
			inscripcion.getTbTipoExamen().setStr_codTipo(codTipoExamen);
			inscripcion.getTbUsuario().setStr_codUsuario(
					alumno.getStr_codUsuario());

			try {

				sIsInscripcion.insertaInscripcion(inscripcion);

				inicializarDatos();

				addFacesMessage(msg.SEVERITY_INFO,
						"Se Registro la Inscripcion Correctamente", null);

			} catch (Exception e) {
				// TODO: handle exception
			}
		}

		return null;
	}

	// public String elegirAlumnoInscripcion() {
	//
	// mAlumno = false;
	//
	// mDtbAlumnos = true;
	//
	// return null;
	//
	// }

	public String registrarHorario() {
		
		
		if(validarRegistroHorario()){

		ECronogramaExamen horario = new ECronogramaExamen();

		horario.setStr_docente(codDocente);
		horario.setStr_aulaExamen(codAula);
		horario.setStr_tipo(codTipoExamen);
		horario.setStr_curso(codCursoDisponible);
		horario.setDt_fechaExamen(new Date());

		sIsCronograma.inserta(horario);

		
		inicializarDatos();
		
		addFacesMessage(msg.SEVERITY_INFO,
				"Se Registro el Horario Satisfactoriamente", null);
		
		
		
		}
		return null;
	}
	
	public boolean validarRegistroHorario(){
		
		
		boolean valida = true;

		if (Util.estaVacio(codCursoDisponible)) {

			addFacesMessage(msg.SEVERITY_ERROR,
					"Tiene que Elegir un Curso para el Registro de Cronograma", null);

			valida = false;
		}
		if (Util.estaVacio(codTipoExamen)) {

			addFacesMessage(msg.SEVERITY_ERROR,
					"Tiene que Elegir un Tipo de Examen para el Registro de Cronograma",
					null);

			valida = false;

		}
		
		if (Util.estaVacio(codDocente)) {

			addFacesMessage(msg.SEVERITY_ERROR,
					"Tiene que Elegir un Docente para el Registro de Cronograma",
					null);

			valida = false;

		}
		
		if (Util.estaVacio(codAula)) {

			addFacesMessage(msg.SEVERITY_ERROR,
					"Tiene que Elegir un Aula para el Registro de Cronograma",
					null);

			valida = false;

		}

		return valida;
		
	}
	

	public String elegirCurso() {

		FacesContext facesContext = FacesContext.getCurrentInstance();
		UIViewRoot root = facesContext.getViewRoot();
		UIData table = (UIData) root.findComponent("frmRegistroIncripcion")
				.findComponent("dtbAlumnos");
		EUsuario seleccionado = (EUsuario) table.getRowData();

		alumno = seleccionado;

		mDtbAlumnos = false;

		mAlumno = true;

		return null;
	}

	/**
	 * Metodo encargado de cargar las Tipo de Examenes
	 */

	public Map<String, Object> getLstTipoExamen() {
		Map<String, Object> listarFacultad = null;
		try {
			List<ETipoExamen> listar = sIsTipoExamen.listarTipoExamen();
			listarFacultad = new LinkedHashMap<String, Object>();
			listarFacultad.put("[Seleccionar]", "");
			for (int i = 0; i < listar.size(); i++) { // label , value
				listarFacultad.put(listar.get(i).getStr_descTipo(),
						listar.get(i).getStr_codTipo());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listarFacultad;
	}

	/**
	 * Metodo encargado de cargar los Cursos
	 */

	public Map<String, Object> getLstCursoDisponible() {
		Map<String, Object> listarFacultad = null;
		try {
			List<ECurso> listar = sIsCurso.listarTipoCursoXExamen(
					codTipoExamen, alumno.getStr_codUsuario());
			listarFacultad = new LinkedHashMap<String, Object>();
			listarFacultad.put("[Seleccionar]", "");
			for (int i = 0; i < listar.size(); i++) { // label , value
				listarFacultad.put(listar.get(i).getStr_descCurso(), listar
						.get(i).getStr_codCurso());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listarFacultad;
	}

	/**
	 * Metodo encargado de cargar los Cursos Hecho por Alumno
	 */

	public Map<String, Object> getLstCursoDisponibles() {
		Map<String, Object> listarFacultad = null;
		try {
			List<ECurso> listar = sIsCurso.listarTipoCursoXExamen(
					codTipoExamen, cSeguridadController.geteUsuario()
							.getStr_codUsuario());
			listarFacultad = new LinkedHashMap<String, Object>();
			listarFacultad.put("[Seleccionar]", "");
			for (int i = 0; i < listar.size(); i++) { // label , value
				listarFacultad.put(listar.get(i).getStr_descCurso(), listar
						.get(i).getStr_codCurso());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listarFacultad;
	}

	/**
	 * Metodo encargado de cargar los Cursos XExamenes
	 */

	public Map<String, Object> getLstCursosDisponiblesXExamen() {
		Map<String, Object> listarFacultad = null;
		try {
			List<ECurso> listar = sIsCurso
					.listarTipoCursoXExamen(codTipoExamen);
			listarFacultad = new LinkedHashMap<String, Object>();
			listarFacultad.put("[Seleccionar]", "");
			for (int i = 0; i < listar.size(); i++) { // label , value
				listarFacultad.put(listar.get(i).getStr_descCurso(), listar
						.get(i).getStr_codCurso());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listarFacultad;
	}

	public List<EUsuario> getLstAlumnos() {

		lstAlumnos = sIsUsuario.listarAlumnos();

		return lstAlumnos;
	}

	public void setLstAlumnos(List<EUsuario> lstAlumnos) {
		this.lstAlumnos = lstAlumnos;
	}

	public EUsuario getAlumno() {
		return alumno;
	}

	public void setAlumno(EUsuario alumno) {
		this.alumno = alumno;
	}

	public boolean ismDtbAlumnos() {
		return mDtbAlumnos;
	}

	public void setmDtbAlumnos(boolean mDtbAlumnos) {
		this.mDtbAlumnos = mDtbAlumnos;
	}

	public boolean ismAlumno() {
		return mAlumno;
	}

	public void setmAlumno(boolean mAlumno) {
		this.mAlumno = mAlumno;
	}

	public String getCodTipoExamen() {
		return codTipoExamen;
	}

	public void setCodTipoExamen(String codTipoExamen) {
		this.codTipoExamen = codTipoExamen;
	}

	public String getCodCursoDisponible() {
		return codCursoDisponible;
	}

	public void setCodCursoDisponible(String codCursoDisponible) {
		this.codCursoDisponible = codCursoDisponible;
	}

	public String getCodDocente() {
		return codDocente;
	}

	public void setCodDocente(String codDocente) {
		this.codDocente = codDocente;
	}

	public String getCodAula() {
		return codAula;
	}

	public void setCodAula(String codAula) {
		this.codAula = codAula;
	}

	/**
	 * Metodo encargado de cargar las Aulas
	 */

	public Map<String, Object> getLstAula() {
		Map<String, Object> listarAula = null;
		try {
			List<EAula> listar = sIsAula.listarAulas();
			listarAula = new LinkedHashMap<String, Object>();
			listarAula.put("[Seleccionar]", "");
			for (int i = 0; i < listar.size(); i++) { // label , value
				listarAula.put(listar.get(i).getStr_descAula(), listar.get(i)
						.getInt_codAula());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listarAula;
	}

	/**
	 * Metodo encargado de cargar los Docentes
	 */

	public Map<String, Object> getLstDocente() {
		Map<String, Object> listarDocente = null;
		try {
			List<EUsuario> listar = sIsUsuario.listarDocentes();
			listarDocente = new LinkedHashMap<String, Object>();
			listarDocente.put("[Seleccionar]", "");
			for (int i = 0; i < listar.size(); i++) { // label , value
				listarDocente.put(listar.get(i).getNombreCompleto(), listar
						.get(i).getStr_codUsuario());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listarDocente;
	}

	public List<ECronogramaExamen> getLstHorarios() {

		lstHorario = sIsCronograma.listarCronogramaExamenes();

		return lstHorario;
	}

	public void setLstHorario(List<ECronogramaExamen> lstHorario) {
		this.lstHorario = lstHorario;
	}

	public List<ECronogramaExamen> getLstHorario() {
		return lstHorario;
	}

	@Override
	public boolean antesDeGuardar() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public void despuesDeGuardar() {
		// TODO Auto-generated method stub

	}

	@Override
	public String getInicializarControles() {
		// TODO Auto-generated method stub
		return null;
	}

	public List<EInscripcion> getLstInscripcion() {
		lstInscripcion = sIsInscripcion.consulta(codTipoExamen,
				codCursoDisponible);

		return lstInscripcion;
	}

	public void setLstInscripcion(List<EInscripcion> lstInscripcion) {
		this.lstInscripcion = lstInscripcion;
	}

	public String getRegistrarInscripcionAlumno() {
	

		return "registrarInscripcionAlumno.xhtml";
	}

	public String getGenerarHorario() {
		

		return "generarHorario.xhtml";
	}

	public String getListaAlumnosInscritos() {

	
		return "listaAlumnosInscritos.xhtml";
	}

	public String getGenerarHistoricoNotas() {

		return "generarHistoricoNotas.xhtml";
	}



	public String getRegistrarInscripcionPorElAlumno() {
	

		return "registrarInscripcionPorElAlumno.xhtml";
	}

}
